#include <stdio.h>
#include <string.h>

/*
前言
c语言里，声明字符串的方法和其他语言不同。

*/

int main(){
    // 数值类型数组
    // 注意！数值类型(int,double,float,short……)数组没有终止符--'\0'!!!
    // 终止符--'\0'是字符(串)数组专属！！！
    // 声明一个长度为10的空数组
    int password[10] = {0};
    printf("int_sizeof: %zu\n",sizeof(password)); // int类型占4字节，4x10=40，此数组占40字节
    

    // 数值类型数组计算数组长度办法：
    int arr[] = {1,2,3,4,5};    // 不指定长度时，数组内存动态分配，计算的是元素个数
    int len = sizeof(arr) / sizeof(arr[0]); // 总字节数 / 单个元素字节数 = 元素个数
    printf("int_len: %d\n",len);

    // 指定长度时不能用上面的公式，因为已经开辟了n个字节的内存，不会动态分配空间。
    int arr1[10] = {1,2,3,4,5};    // 指定长度时，所以计算的是数组最大长度
    int len1 = sizeof(arr1) / sizeof(arr1[0]); 
    printf("int_len1: %d\n",len1);

    // 循环是计算数组元素长度的另一个办法
    
    
    // 字符串数组
    char str[10] = {0}; // 空数组
    printf("str_sizeof: %zu\n",sizeof(str)); // char类型占一个字节，1x10=10
    printf("str: %d\n",strlen(str));  // 长度为0
    /* strlen()语法，从下标0开始索引，遇到\0退出，char str[10] = {0};代表10个'\0'
    即{'\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'}
    因为strlen函数一旦索引到'\0'就退出，所以返回长度是0
    */

    // strlen()函数，用以计算当前字符(串)数组的元素个数。

    /*
    注意，在c语言中，声明字符串，后面必须以'\0'结尾。
    这个'\0'是占一个位置的。
    也就是说，char str[10]时，其实有效存储字符的空间是9个，最后一个要用来存'\0'
    char str1[10] = {'a','b','c','d','e','f','g','h','i','j'};
    上面的str1存了10个字符，没有'\0'的位置了，此时用strlen(str1)计算长度时，
    计算机会一直索引到数组的最后一位，还没找到'\0'，然后就往数组内存之外的地方找，直到找到'\0'为止。
    所以strlen(str1)输出10是运气好。
    正确的做法：char str1[11]
    要给'\0'预留一个位置。
    */
    char str1[11] = {'a','b','c','d','e','f','g','h','i','j'};
    printf("str1: %d\n",strlen(str1));  // 长度为10

    char str2[10] = "abcdefghi";  //默认有一位'\0'作为字符串终止符，所以只能是a~i而不是a~j
    printf("str2: %d\n",strlen(str2));  // 长度为9

    char str2_1[10] = "abcd";   // 如果未完全使用空间，后面会全部补'\0'
    printf("str2_1: %d\n",strlen(str2_1));  // 长度为4

    char str3[] = {'a','b','c','d','e','f','g','h','i','j'};
    printf("str3: %d\n",strlen(str3));  // 长度随机，因为数组里没有'\0'
    /*如果只是想存储字符，而不使用，可以这样写，不指定数组长度。
    但是这样的后果是跟前面提到的一样，虽然数组长度不限，但由于数组里没有终止符--'\0'
    所以打印、用strlen()计算长度时，会出现问题--比如计算长度错误
    */
    
    // 加入终止符--'\0'后，可以正确计算长度
    char str4[] = {'a','b','c','d','e','f','g','h','i','j','\0'};
    printf("str4: %d\n",strlen(str4));  // 长度为10

    // 当不指定长度时，且不是用{}存储时，可以定义任意长度字符串，且会在后面自动补'\0'
    char str5[] = "abcdefghij";
    printf("str5: %d\n",strlen(str5));  // 长度为10
}